// 工具方法库
import { TRAILING_SLASH_RE } from './contant'

export const removeTrailingSlash = (path: string) => path.replace(TRAILING_SLASH_RE, '')

// 规范化用户所传递的 base
// 假设用户传递的 base 为 app/
// 经过这个方法处理后 ---> /app
export function normalizeBase(base?: string): string {
  // 如果没有 base，统一初始化为一个 /
  if (!base) {
    base = '/'
  }
  // 检查第一个字符如果不是 / 或者 #
  // 那么就在最前面拼接一个 /
  // 例如传入的 base 是 app，那么这一步处理后就变为 /app
  if (base[0] !== '/' && base[0] !== '#') base = '/' + base
  // 去除字符串末尾的 /
  return removeTrailingSlash(base)
}

/**
 * 该函数的作用是从一个路径中去除基础路径
 * 例如：
 * const base = '/app'
 * let pathname = '/app/home'
 * pathname = stripBase(pathname, base)
 * console.log(pathname) // 输出 "/home"
 * @param pathname
 * @param base
 */
export function stripBase(pathname: string, base: string): string {
  // 满足下面的 if，说明不需要去除
  if (!base || !pathname.toLowerCase().startsWith(base.toLowerCase())) return pathname
  // 需要去除
  return pathname.slice(base.length) || '/'
}

export function useCallback<T>() {
  // 存储守卫回调函数的数组
  const handlers: T[] = []

  function add(handler: T) {
    handlers.push(handler)
  }

  return {
    add,
    list: () => handlers
  }
}

